home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hardcore Visual Basic 5.0 (2nd Edition)
/
Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso
/
Code
/
Goodies
/
CallBack
/
SOURCE
/
SVRMAIN.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-29
|
4KB
|
187 lines
/*
* Visual Basic Callback Server Source
*
* (c) Copyright Microsoft Corp. 1995 All Rights Reserved
*/
#include "hostenv.h"
#include "CBackODL.h"
#include "CBackGen.h"
HINSTANCE g_hinst;
ULONG g_cObj=0;
ULONG g_cLock=0;
BOOL (WINAPI *VBInBreakMode)(void) = NULL;
HINSTANCE hinstVBBrk = NULL;
void Initialize()
{
#ifdef WIN32
UINT fuOldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
if (hinstVBBrk = LoadLibrary(SYSSTR("VBBrk32.dll")))
#else
if (hinstVBBrk = LoadLibrary(SYSSTR("VBBrk16.dll")))
#endif
VBInBreakMode = GetProcAddress(hinstVBBrk, SYSSTR("VBInBreakMode"));
#ifdef WIN32
SetErrorMode(fuOldMode);
#endif
return;
}
void Uninitialize()
{
if (hinstVBBrk)
FreeLibrary(hinstVBBrk);
}
#ifdef WIN32
BOOL APIENTRY
LibMain(HINSTANCE hinst, DWORD dw, LPVOID lp)
{
switch (dw)
{
case DLL_PROCESS_ATTACH:
g_hinst = hinst;
Initialize();
break;
case DLL_PROCESS_DETACH:
Uninitialize();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
default:
break;
}
return TRUE;
}
#else
/*LibMain*/
int PASCAL LibMain(HINSTANCE hinst, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine)
{
if (cbHeapSize != 0)
UnlockData(0);
g_hinst = hinst;
Initialize();
return hinst;
}
/*WEP*/
extern "C"
int FAR PASCAL WEP(int bSystemExit)
{
Uninitialize();
return 1;
}
#endif
/*DllGetClassObject
*
*
*
* This is called by OLE when the server is Created through an inproc line in the registry
*/
HRESULT FAR PASCAL DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv)
{
LPCLASSFACTORY pcf = NULL;
*ppv = NULL;
if (IsEqualCLSID(rclsid, CLSID_CallBackGenerator))
pcf = new CCBGeneratorCF;
else
return ResultFromScode(E_FAIL);
if (!pcf)
return ResultFromScode(E_OUTOFMEMORY);
pcf->AddRef();
*ppv = pcf;
return NOERROR;
}
/*DllCanUnloadNow. Called by OLE to see if it can unload the DLL*/
STDAPI DllCanUnloadNow(void)
{
if (g_cObj == 0L && g_cLock == 0L)
return ResultFromScode(S_OK);
return ResultFromScode(S_FALSE);
}
STDAPI DllRegisterServer(void)
{
ITypeLib FAR* ptlib = NULL;
HRESULT hr;
SYSCHAR szSysFileName[128];
LPOLESTR lpOleFileName;
DWORD dwLen;
// If it wasn't registered, load the typelib from the resource in the DLL.
dwLen = GetModuleFileName(g_hinst, szSysFileName, 128);
lpOleFileName = OLESYSSTR(szSysFileName);
if FAILED(hr = LoadTypeLib(lpOleFileName, &ptlib))
{
FREESTR(lpOleFileName);
return hr;
}
else
{
hr = RegisterTypeLib(ptlib, lpOleFileName, NULL);
FREESTR(lpOleFileName);
if FAILED(hr)
{
ptlib->Release();
return hr;
}
}
ptlib->Release();
HKEY hkey;
#ifdef WIN32
DWORD dwDisposition;
RegCreateKeyEx(HKEY_CLASSES_ROOT,
SYSSTR("CLSID\\{10679783-9B4B-11CE-BE8C-00AA004C835D}\\InprocServer32"),
NULL, SYSSTR(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&hkey, &dwDisposition);
RegSetValueEx(hkey, NULL, NULL, REG_SZ, (const unsigned SYSCHAR *) szSysFileName, dwLen + 1);
#else
RegCreateKey(HKEY_CLASSES_ROOT,
SYSSTR("CLSID\\{10679783-9B4B-11CE-BE8C-00AA004C835D}\\InprocServer"),
&hkey);
RegSetValue(hkey, NULL, REG_SZ, szSysFileName, dwLen + 1);
#endif
RegCloseKey(hkey);
return NOERROR;
}
HRESULT LoadResourceTypeLib(REFIID libid, REFIID riid, ITypeInfo FAR* FAR* ppTInfo)
{
ITypeLib FAR* ptlib = NULL;
HRESULT hr;
if (*ppTInfo)
{
(*ppTInfo)->Release();
*ppTInfo = NULL;
}
//Version set at 1.0, check here if necessary.
if( (hr = LoadRegTypeLib(libid, 1, 0, 0, &ptlib)) != NOERROR )
{
SYSCHAR szSysFileName[128];
LPOLESTR lpOleFileName;
// If it wasn't registered, load the typelib from the resource in the DLL.
GetModuleFileName(g_hinst, szSysFileName, 128);
lpOleFileName = OLESYSSTR(szSysFileName);
if( (hr = LoadTypeLib(lpOleFileName, &ptlib)) != NOERROR)
{
FREESTR(lpOleFileName);
return hr;
}
else
{
hr = RegisterTypeLib(ptlib, lpOleFileName, NULL);
FREESTR(lpOleFileName);
if (hr != NOERROR)
return hr;
}
}
hr = ptlib->GetTypeInfoOfGuid(riid, ppTInfo);
ptlib->Release();
return hr;
}